#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QGridLayout>
#include <QLabel>
#include <QPaintEvent>
#include <QPainter>
#include <QPainterPath>
#include <QPushButton>
#include <QScrollArea>
#include <QScrollBar>
#include <QTimer>
#include <QWidget>

#include "model/data.h"

using model::Message;
////////////////////////////////////////////////////////
/// 表示消息展示区
////////////////////////////////////////////////////////

class MessageShowArea : public QScrollArea
{
    Q_OBJECT
  public:
    MessageShowArea();

    // 尾插
    void addMessage(bool isLeft, const Message &message);
    // 头插
    void addFrontMessage(bool isLeft, const Message &message);
    // 清空消息
    void clear();
    // 滚动到末尾
    void scrollToEnd();

  private:
    QWidget *_container;
};

////////////////////////////////////////////////////////
/// 表示一个消息元素
/// 同时支持 文本消息, 图片消息, 文件消息, 语音消息.
////////////////////////////////////////////////////////

class MessageItem : public QWidget
{
    Q_OBJECT
  public:
    MessageItem(bool isLeft);

    static MessageItem *makeMessageItem(bool isLeft, const Message &message);

    // 工厂函数
    static QWidget *makeTextMessageItem(bool isLeft, const QString &text);
    static QWidget *makeImageMessageItem(bool isLeft, const QString &fileId, const QByteArray &content);
    static QWidget *makeFileMessageItem(bool isLeft, const Message &message);
    static QWidget *makeSpeechMessageItem(bool isLeft, const Message &message);

  private:
    bool _isLeft; // 表示这个 Item 是否是一个 左侧消息
};

////////////////////////////////////////////////////////
/// 创建类表示 "文本消息" 正文部分
/// 也让这个类表示 "文件消息"
////////////////////////////////////////////////////////

class MessageContentLabel : public QWidget
{
    Q_OBJECT
  public:
    MessageContentLabel(const QString &text, bool isLeft, model::MessageType messageType, const QString &fileId,
                        const QByteArray content);
    void paintEvent(QPaintEvent *event) override;

  private:
    QLabel *_label;
    bool _isLeft;
    model::MessageType _messageType;
    QString _fileId;
    QByteArray _content;
};

////////////////////////////////////////////////////////
/// 创建类表示 "图片消息" 正文部分
////////////////////////////////////////////////////////

class MessageImageLabel : public QWidget
{
    Q_OBJECT

  public:
    MessageImageLabel(const QString &fileId, const QByteArray &content, bool isLeft);

    // void updateUI(const QString &fileId, const QByteArray &content);
    // void paintEvent(QPaintEvent *event);

  private:
    QPushButton *_imageBtn;

    QString _fileId;     // 该图片在服务器对应的文件 id.
    QByteArray _content; // 图片的二进制数据
    bool _isLeft;
};

#endif // MESSAGESHOWAREA_H
